The most common problems arise because the size of a pointer and of a long int changes between a program compiled with the -64 option and one compiled -32. When pointers, longs, or types derived from longs, are used in structures, the field offsets differ between the two modes.
When all programs in the system are compiled to the same mode, there is no problem. This is the case for a system in which the kernel is compiled to 32-bit mode: only 32-bit user programs are supported. However, a kernel compiled to 64-bit mode executes user programs in 32-bit or 64-bit mode. A structure prepared by a 32-bit program--a structure passed as an argument to ioctl(), for example--does not have fields at the offsets expected by a 64-bit kernel device driver. For more on this specific problem, see "Handling 32-Bit and 64-Bit Execution Models".
The header files sgidefs.h and sys/types.h define type names that you can use to declare structures that always have the same size.